
# -*- coding: utf-8 -*-

import debug
import logging
import datetime
from SeBase import SeBase
import glob

class SeFile(SeBase):
    @debug.entry
    def __init__(self, config=None):
        '''
            <TODO>
                コンフィグ読み込みや永続化が必要なストレージ接続を行う
        '''
        self.config = config
        self.__read_config(self.config)

    def __read_config(self, config):
        '''
            <TODO>
                ストレージ接続に必要な情報を読み込む
            SeFileでは保存先パスのみ
        '''
        self.path = config['object'].get(self.__class__.__name__, 'path')

    @debug.entry
    def get_frame_list_all(self, target, fext='.jpg'):
        '''
            <TODO>
                ストレージに保存されたフレームリストを返す
            target : カメラID
            return : パス、拡張子を含まないリスト(全件)
                ex)
                    target@YYYY-mm-ddTHH:MM:SS.ffffffZ
        '''
        #pattern = '../' + self.path + '/' + target + '@*.*Z.jpg'
        pattern = self.path + '/' + target + '@*.*' + fext
        logging.debug("Frame Search : %s" % pattern)
        items = glob.glob(pattern)
        items.sort()
        for item in items:
            #name  = item.replace('../' + self.path + '/', '')
            name = item.replace(self.path + '/', '')
            name = name.replace(fext, '')
            items[items.index(item)] = name
        return items

    @debug.entry
    def get_frame_list_first(self, target, fext='.jpg'):
        '''
            <TODO>
                ストレージに保存されたフレームで一番古いものを返す
            target : カメラID
            return : パス、拡張子を含まないリスト(1件)
                ex)
                    target@YYYY-mm-ddTHH:MM:SS.ffffffZ
        '''
        return self.get_frame_list_all(target, fext)[:1]

    @debug.entry
    def get_frame_list_last(self, target, fext='.jpg'):
        '''
            <TODO>
                ストレージに保存されたフレームで一番新しいものを返す
            target : カメラID
            return : パス、拡張子を含まないリスト(1件)
                ex)
                    target@YYYY-mm-ddTHH:MM:SS.ffffffZ
        '''
        return self.get_frame_list_all(target, fext)[-1:]

    @debug.entry
    def get_frame_list_range(self, target, query, fext):
        '''
            <TODO>
                ストレージに保存されたフレームの時間範囲で返す
            target : カメラID
            query  : list(termfrom, termto)
            return : パス、拡張子を含まないリスト(N件)
                ex)
                    target@YYYY-mm-ddTHH:MM:SS.ffffffZ
        '''
        termfrom = datetime.datetime.strptime(query[0], '%Y-%m-%dT%H:%M:%S.%fZ')
        termto   = datetime.datetime.strptime(query[1], '%Y-%m-%dT%H:%M:%S.%fZ')
        logging.debug("Frame Search Range : %s - %s" % (termfrom, termto))

        resp = []
        items = self.get_frame_list_all(target, fext)
        for item in items:
            timestring = item.split('@')[1]
            timeobject = datetime.datetime.strptime(timestring, '%Y-%m-%dT%H:%M:%S.%fZ')
            if timeobject >= termfrom and timeobject <= termto:
                respstring = target + '@' + timeobject.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
                resp.append(respstring)
        return resp

    @debug.entry
    def save_frame(self, target, fileobj, fext='.jpg', uniqname=None, options={'async':False} ):
        '''
            <TODO>
                ストレージにフレームを保存する
            target   : カメラID
            fileobj  : 保存するオブジェクト
            uniqname : reserved
            options  : reserved
        '''
        if uniqname:
            filename = self.path + '/' + target + '@' + uniqname + fext
        else:
            today = datetime.datetime.today()
            filename = self.path + '/' + target + '@' + today.strftime('%Y-%m-%dT%H:%M:%S.%fZ') + fext
        logging.info("save_frame : %s" % filename)
        fp = open(filename, 'wb')
        fp.write(fileobj)
        fp.close()

    @debug.entry
    def get_frame(self, framestring, fext='.jpg'):
        '''
            <TODO>
                ストレージに格納されたフレームの実体を返す
            target      : カメラID
            framestring : クエリ結果のフレームを示す文字列
            return      : フレームの実体
        '''
        #filename = '../' + self.path + '/' + framestring + '.jpg'
        filename = self.path + '/' + framestring + fext
        fp = open(filename, 'rb')
        fileobj = fp.read()
        fp.close()
        return fileobj

